package algoWing42.modelo;

import java.io.Serializable;

import titiritero.ObjetoVivo;
import titiritero.Posicionable;


public abstract class ObjetoDinamico implements Posicionable, ObjetoVivo, Serializable {
    /**
	 * 
	 */
	private static final long serialVersionUID = -1852833851293836006L;
	private boolean estaMuerto;
    private Circulo areaOcupada;

    protected ObjetoDinamico(int x, int y, int radio) {
        estaMuerto = false;
        areaOcupada = new Circulo(x, y, radio);
    }

    /**
     * Se debe redefinir en cada caso.
     */
    protected void mover() {};

    /**
     * Metodo de double dispatch.
     */
    public void colisionCon(ObjetoDinamico objeto) {};

    /**
     * Metodo de dispatch contra el jugador, TODAS las subclases deben tener
     * una implementacion.
     */
    public abstract void colisionConJugador(AvionJugador jugador);

    /**
     * Dispatchea dinamicamente si la distancia entre los 2 objetos es
     * menor a la suma de sus radios.
     */
    public void evaluarColision(ObjetoDinamico unObjetoDinamico) {
        if ((this.estaMuerto() == false) &&
                (unObjetoDinamico.estaMuerto() == false)) {
            if (this.getArea().seSuperponen(unObjetoDinamico.getArea()))
                this.colisionCon(unObjetoDinamico);            
        }
    }

    protected void moverEnDireccion(int x, int y) {
        this.areaOcupada.mover(x, y);
    }

    protected void moverEnDireccion(Punto punto) {
        this.areaOcupada.mover(punto);
    }

    /**
     * Traslada el objeto a un punto.
     */
    protected void moverA(int x, int y) {
        this.areaOcupada.ubicarEn(x, y);
    }

    public Circulo getArea() {
        return this.areaOcupada;
    }

    public boolean estaMuerto() {
        return estaMuerto;
    }

    /**
     * Metodo general para destruirse, se debe redefinir
     * si es necesario.
     */
    protected void destruir() {
        this.estaMuerto = true;
    }

    /**
     * Metodo general para vivir, se debe redefinir si
     * es necesario.
     */
    public void vivir() {
        this.mover();
    }

    public int getX() {
        return this.getArea().getPosicion().getX();
    }

    public int getY() {
        return this.getArea().getPosicion().getY();
    }

    public void setY(int nuevoY) {
        this.getArea().getPosicion().setY(nuevoY);
    }

    public void setX(int nuevoX) {
        this.getArea().getPosicion().setY(nuevoX);
    }
}
